package com.cskaoyan.interfaces.supplement;



/*
     从jdk8开始，接口中有两种方法可以有方法体:
     1. 默认方法：用default修饰的方法，默认的权限修饰符 public
         当我们已经定义好了一个接口，有时又需要修改接口，而且不希望那些已经实现了接口的类受到影响
         ，此时我们就可以使用默认方法

     2. 静态方法：用static修饰的方法，默认权限修饰符也是public
           当我们需要工具方法的时候，使用静态方法定义工具方法


      注意:
        虽然说从jdk8开始，就有了默认方法和静态方法可以又方法体，但是99%场景中，接口中我们仍然
        只定义抽象方法

 */
public interface JDK8Interface {


    // 默认方法，可以有方法体(类比于普通成员方法)
   default void defaultMethod() {
        System.out.println("jdk8 defaultMethod");
    }
    // 静态方法，可以有方法体
    static void staticMethod() {
        System.out.println("jdk8 staticMethod");
    }

    static void testStaticMethod() {
        // 在定义静态方法的接口中，可以调用静态方法
        staticMethod();
    }

    /*
         增加抽象方法，实现了接口的类马上会报错(被影响语法)
     */
    void absMethod();

    /*
         增加默认方法，实现了接口的类不会受到任何影响
     */
    default void newDefaultMethod()  {



    }

}

/*
     子接口
 */
interface SonInterface extends JDK8Interface {

    /*
         子接口中可以覆盖父接口中定义的默认方法的
     */
    @Override
    default void defaultMethod() {
    }

    default void sonDefaultMethod() {

        // 调用父接口中的默认方法
        defaultMethod();

        // 在子接口中访问父接口的接口的静态方法， 不可以，可以在定义静态方法的接口中来访问静态方法
        //staticMethod();

    }
}



/*
        子类
 */
class Jkd8InterfaceClass implements JDK8Interface {

    @Override
    public void absMethod() {
        // 像普通成员方法一样，去调用继承的接口中的默认方法
        //defaultMethod();


        // 在子类中访问父接口的接口的静态方法， 不可以，可以在定义静态方法的接口中来访问静态方法
        //staticMethod();

        Test test = new Test();
        test.method();

        Test.method();

    }
}

class Test {

    /*
        就是专门定义出来给别人的，实现通用功能的方法,我们称之为工具方法
        为了方便使用，工具方法通常定义为static
     */
    public static void method() {

    }
}
